package com.bos.prop.controller.json;

import com.bos.dao.JumlahSiswaDAO;
import com.bos.dao.PeriodeDAO;
import com.bos.dao.SekolahDAO;
import com.bos.domain.JumlahSiswa;
import com.bos.domain.Periode;
import com.bos.domain.Sekolah;
import com.bos.editor.JumlahSiswaEditor;
import com.bos.editor.PeriodeEditor;
import com.bos.editor.SekolahEditor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: Latief
 * Date: 3/17/11
 * Time: 8:29 PM
 * To change this template use File | Settings | File Templates.
 */
@Controller
public class JumlahSiswaJsonController {

    private JumlahSiswaDAO jumlahSiswaDAO;
    private PeriodeDAO periodeDAO;
    private SekolahDAO sekolahDAO;

/* --------------------- Getter and Setter ---------------------*/

    @Autowired
    public void setJumlahSiswaDAO(JumlahSiswaDAO jumlahSiswaDAO) {
        this.jumlahSiswaDAO = jumlahSiswaDAO;
    }

    @Autowired
    public void setPeriodeDAO(PeriodeDAO periodeDAO) {
        this.periodeDAO = periodeDAO;
    }

    @Autowired
    public void setSekolahDAO(SekolahDAO sekolahDAO) {
        this.sekolahDAO = sekolahDAO;
    }

    /**
     * ************** JSON **************************************************************************
     */

    @RequestMapping(value = "sekolah/{npsn}/jumlahSiswa.json", method = RequestMethod.POST)
    public
    @ResponseBody
    Map<String, Object> save(@PathVariable("npsn") Sekolah sekolah, @RequestBody JumlahSiswa jumlahSiswa) {
        if (jumlahSiswa == null) throw new IllegalArgumentException("A Product is required");
        Map<String, Object> result = new HashMap<String, Object>();
        try {
            jumlahSiswa.setSekolah(sekolah);
            jumlahSiswaDAO.save(jumlahSiswa);
            result.put("success", true);
            result.put("jumlahSiswa", jumlahSiswa);
            result.put("message", "Sukses Save JumlahSiswa " + jumlahSiswa);
        } catch (DataAccessException e) {
            result.put("success", false);
            result.put("jumlahSiswa", jumlahSiswa);
            result.put("exception", e.getMessage());
            result.put("message", "Gagal Save JumlahSiswa " + jumlahSiswa);
        }
        return result;
    }

    @RequestMapping(value = "sekolah/{npsn}/jumlahSiswa/periode/{periodeId}/delete.json", method = RequestMethod.GET)
    public
    @ResponseBody
    Map<String, Object> delete(@PathVariable("npsn") Sekolah sekolah, @PathVariable("periodeId") Periode periode) {
        Map<String, Object> result = new HashMap<String, Object>();
        JumlahSiswa jumlahSiswa = null;
        try {
            /**
             * Karena data JumlahSiswa di propinsi dan kabupaten berbeda primary key, dan field sekolah+periode lah yang
             * menunjukkan bahwa data JumlahSiswa di propinsi dan kabupaten adalah data yang sama. Maka dicari dulu
             * data JumlahSiswa berdasarkan sekolah+periode. Kemudain hapus.
             */
            jumlahSiswa = jumlahSiswaDAO.getBySekolahPeriode(sekolah, periode);
            jumlahSiswaDAO.delete(jumlahSiswa);
            result.put("success", true);
            result.put("message", "Sukses Delete JumlahSiswa " + jumlahSiswa);
        } catch (DataAccessException e) {
            result.put("success", false);
            result.put("exception", e.getMessage());
            result.put("message", "Gagal Delete JumlahSiswa " + jumlahSiswa);
        }
        return result;
    }

    @RequestMapping(value = "sekolah/{npsn}/jumlahSiswa/periode/{periodeId}.json", method = RequestMethod.PUT)
    public
    @ResponseBody
    Map<String, Object> update(@PathVariable("npsn") Sekolah sekolah, @PathVariable("periodeId") Periode periode, @RequestBody JumlahSiswa jumlahSiswa) {
        if (jumlahSiswa == null) throw new IllegalArgumentException("A Product is required");
        Map<String, Object> result = new HashMap<String, Object>();
        try {
            /**
             * Karena data JumlahSiswa berbeda id/primary key dengan kabupaten. maka dicari dahulu data JumlahSiswa berdasarkan sekolah+periode nya.
             * Jika sekolah+periodenya sama, maka data JumlahSiswa merupakan data yang sama dengan data di kabupaten.
             * Setelah mendapatkan data JumlahSiswa local yg sama, maka ganti isi data JumlahSiswa local dengan data yang telah dirubah
             * di kabupaten. Setelah itu data disimpan di database lokal.
             */
            JumlahSiswa jumlahSiswaLocal = jumlahSiswaDAO.getBySekolahPeriode(sekolah, periode);   //cari berdasarkan sekolah + periode
            jumlahSiswaLocal.setKelas1L(jumlahSiswa.getKelas1L());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas1P(jumlahSiswa.getKelas1P());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas2L(jumlahSiswa.getKelas2L());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas2P(jumlahSiswa.getKelas2P());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas3L(jumlahSiswa.getKelas3L());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas3P(jumlahSiswa.getKelas3P());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas4L(jumlahSiswa.getKelas4L());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas4P(jumlahSiswa.getKelas4P());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas5L(jumlahSiswa.getKelas5L());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas5P(jumlahSiswa.getKelas5P());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas6L(jumlahSiswa.getKelas6L());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas6P(jumlahSiswa.getKelas6P());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas7L(jumlahSiswa.getKelas7L());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas7P(jumlahSiswa.getKelas7P());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas8L(jumlahSiswa.getKelas8L());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas8P(jumlahSiswa.getKelas8P());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas9L(jumlahSiswa.getKelas9L());      // ganti dengan data baru
            jumlahSiswaLocal.setKelas9P(jumlahSiswa.getKelas9P());      // ganti dengan data baru
            jumlahSiswaLocal.setUmur6(jumlahSiswa.getUmur6());          // ganti dengan data baru
            jumlahSiswaLocal.setUmur7_12(jumlahSiswa.getUmur7_12());    // ganti dengan data baru
            jumlahSiswaLocal.setUmur13(jumlahSiswa.getUmur13());        // ganti dengan data baru
            jumlahSiswaLocal.setPeriode(jumlahSiswa.getPeriode());      // ganti dengan data baru
            jumlahSiswaDAO.merge(jumlahSiswaLocal);   // simpan
            result.put("success", true);
            result.put("jumlahSiswa", jumlahSiswaLocal);
            result.put("message", "Sukses Update JumlahSiswa " + jumlahSiswaLocal);
        } catch (DataAccessException e) {
            result.put("success", false);
            result.put("jumlahSiswa", jumlahSiswa);
            result.put("exception", e.getMessage());
            result.put("message", "Gagal Update JumlahSiswa " + jumlahSiswa);
        }
        return result;
    }

    @InitBinder
    protected void initBinder(WebDataBinder binder) throws Exception {
        binder.registerCustomEditor(Sekolah.class, new SekolahEditor(sekolahDAO));
        binder.registerCustomEditor(Periode.class, new PeriodeEditor(periodeDAO));
        binder.registerCustomEditor(JumlahSiswa.class, new JumlahSiswaEditor(jumlahSiswaDAO));
    }
}
